#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <inttypes.h>
#include <time.h>
#include <sys/file.h> // flock
#include <lxShmOpt.h>

#define myChkLockFileName "/tmp/myChkShmLock.txt"
#define myChkQueMaxRdrNbr 10
// 测试:
// ./test 0
// ./test 1
// 测试结果：
// 进程互锁OK。SUB进程会等10秒才能打印lock。
// 主进程被杀死，sub进程能正常1秒打印lock。
// 主线程被杀死后再次启动，SUB进程会等10秒才能打印lock。
// 达到预期。
// 可以用flock+memshare，而不是信号量（崩溃时不好处理）+共享内存。

int main(int argsize, const char **args)
{
    if(argsize < 2)
    {
        logdebugc("");
        return -1;
    }
    int tmpid = atoi(args[1]);
    if(!(tmpid >= 0 && tmpid < myChkQueMaxRdrNbr))
    {
        logdebugc("id error:%d", tmpid);
        return -1;
    }
    logdebugc("%d", tmpid);
    shmOptInfStc tmpShmInf;
    if(shmOptInit(&tmpShmInf, 0x12345600, 128 * 1024, myChkQueMaxRdrNbr, myChkLockFileName) < 0)
    {
        logdebugc("init error:%d", tmpid);
        return -1;
    }
    queOptResetR(tmpShmInf.qasPtr, tmpid);
    while (1)
    {
        char tmpbuf[256];
        snprintf(tmpbuf, sizeof(tmpbuf), "write id[%d] opt", tmpid);
        logdebugc("[%u,%u]%s", tmpShmInf.qasPtr->ridx[tmpid], tmpShmInf.qasPtr->widx, tmpbuf);
        shmOptWrite(&tmpShmInf, (const uint8_t *)tmpbuf, strlen(tmpbuf));
        usleep(10 * 1000);
        memset(tmpbuf, 0, sizeof(tmpbuf));
        shmOptRead(&tmpShmInf, tmpid, (uint8_t *)tmpbuf, sizeof(tmpbuf));
        logdebugc("read[%u,%u]%s", tmpShmInf.qasPtr->ridx[tmpid], tmpShmInf.qasPtr->widx, tmpbuf);
        sleep(1);
    }
    return 0;
}
